home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / PROGMISC / PCSSP.LZH / PC-SSP.ZIP / POLYROOT.ZIP / POLRT.FOR < prev    next >
Text File  |  1985-11-29  |  5KB  |  200 lines

  1. C
  2. C     ..................................................................
  3. C
  4. C        SUBROUTINE POLRT
  5. C
  6. C        PURPOSE
  7. C           COMPUTES THE REAL AND COMPLEX ROOTS OF A REAL POLYNOMIAL
  8. C
  9. C        USAGE
  10. C           CALL POLRT(XCOF,COF,M,ROOTR,ROOTI,IER)
  11. C
  12. C        DESCRIPTION OF PARAMETERS
  13. C           XCOF -VECTOR OF M+1 COEFFICIENTS OF THE POLYNOMIAL
  14. C                 ORDERED FROM SMALLEST TO LARGEST POWER
  15. C           COF  -WORKING VECTOR OF LENGTH M+1
  16. C           M    -ORDER OF POLYNOMIAL
  17. C           ROOTR-RESULTANT VECTOR OF LENGTH M CONTAINING REAL ROOTS
  18. C                 OF THE POLYNOMIAL
  19. C           ROOTI-RESULTANT VECTOR OF LENGTH M CONTAINING THE
  20. C                 CORRESPONDING IMAGINARY ROOTS OF THE POLYNOMIAL
  21. C           IER  -ERROR CODE WHERE
  22. C                 IER=0  NO ERROR
  23. C                 IER=1  M LESS THAN ONE
  24. C                 IER=2  M GREATER THAN 36
  25. C                 IER=3  UNABLE TO DETERMINE ROOT WITH 500 INTERATIONS
  26. C                        ON 5 STARTING VALUES
  27. C                 IER=4  HIGH ORDER COEFFICIENT IS ZERO
  28. C
  29. C        REMARKS
  30. C           LIMITED TO 36TH ORDER POLYNOMIAL OR LESS.
  31. C           FLOATING POINT OVERFLOW MAY OCCUR FOR HIGH ORDER
  32. C           POLYNOMIALS BUT WILL NOT AFFECT THE ACCURACY OF THE RESULTS.
  33. C
  34. C        SUBROUTINES AND FUNCTION SUBPROGRAMS REQUIRED
  35. C           NONE
  36. C
  37. C        METHOD
  38. C           NEWTON-RAPHSON ITERATIVE TECHNIQUE.  THE FINAL ITERATIONS
  39. C           ON EACH ROOT ARE PERFORMED USING THE ORIGINAL POLYNOMIAL
  40. C           RATHER THAN THE REDUCED POLYNOMIAL TO AVOID ACCUMULATED
  41. C           ERRORS IN THE REDUCED POLYNOMIAL.
  42. C
  43. C     ..................................................................
  44. C
  45.       SUBROUTINE POLRT(XCOF,COF,M,ROOTR,ROOTI,IER)
  46.       DIMENSION XCOF(1),COF(1),ROOTR(1),ROOTI(1)
  47.       DOUBLE PRECISION XO,YO,X,Y,XPR,YPR,UX,UY,V,YT,XT,U,XT2,YT2,SUMSQ,
  48.      1 DX,DY,TEMP,ALPHA
  49. C
  50. C        ...............................................................
  51. C
  52. C        IF A DOUBLE PRECISION VERSION OF THIS ROUTINE IS DESIRED, THE
  53. C        C IN COLUMN 1 SHOULD BE REMOVED FROM THE DOUBLE PRECISION
  54. C        STATEMENT WHICH FOLLOWS.
  55. C
  56. C     DOUBLE PRECISION XCOF,COF,ROOTR,ROOTI
  57. C
  58. C        THE C MUST ALSO BE REMOVED FROM DOUBLE PRECISION STATEMENTS
  59. C        APPEARING IN OTHER ROUTINES USED IN CONJUNCTION WITH THIS
  60. C        ROUTINE.
  61. C        THE DOUBLE PRECISION VERSION MAY BE MODIFIED BY CHANGING THE
  62. C        CONSTANT IN STATEMENT 78 TO 1.0D-12 AND IN STATEMENT 122 TO
  63. C        1.0D-10.  THIS WILL PROVIDE HIGHER PRECISION RESULTS AT THE
  64. C        COST OF EXECUTION TIME
  65. C
  66. C        ...............................................................
  67. C
  68.       IFIT=0
  69.       N=M
  70.       IER=0
  71.       IF(XCOF(N+1))10,25,10
  72.    10 IF(N) 15,15,32
  73. C
  74. C        SET ERROR CODE TO 1
  75. C
  76.    15 IER=1
  77.    20 RETURN
  78. C
  79. C        SET ERROR CODE TO 4
  80. C
  81.    25 IER=4
  82.       GO TO 20
  83. C
  84. C        SET ERROR CODE TO 2
  85. C
  86.    30 IER=2
  87.       GO TO 20
  88.    32 IF(N-36) 35,35,30
  89.    35 NX=N
  90.       NXX=N+1
  91.       N2=1
  92.       KJ1 = N+1
  93.       DO 40 L=1,KJ1
  94.       MT=KJ1-L+1
  95.    40 COF(MT)=XCOF(L)
  96. C
  97. C        SET INITIAL VALUES
  98. C
  99.    45 XO=.00500101
  100.       YO=0.01000101
  101. C
  102. C        ZERO INITIAL VALUE COUNTER
  103. C
  104.       IN=0
  105.    50 X=XO
  106. C
  107. C        INCREMENT INITIAL VALUES AND COUNTER
  108. C
  109.       XO=-10.0*YO
  110.       YO=-10.0*X
  111. C
  112. C        SET X AND Y TO CURRENT VALUE
  113. C
  114.       X=XO
  115.       Y=YO
  116.       IN=IN+1
  117.       GO TO 59
  118.    55 IFIT=1
  119.       XPR=X
  120.       YPR=Y
  121. C
  122. C        EVALUATE POLYNOMIAL AND DERIVATIVES
  123. C
  124.    59 ICT=0
  125.    60 UX=0.0
  126.       UY=0.0
  127.       V =0.0
  128.       YT=0.0
  129.       XT=1.0
  130.       U=COF(N+1)
  131.       IF(U) 65,130,65
  132.    65 DO 70 I=1,N
  133.       L =N-I+1
  134.       TEMP=COF(L)
  135.       XT2=X*XT-Y*YT
  136.       YT2=X*YT+Y*XT
  137.       U=U+TEMP*XT2
  138.       V=V+TEMP*YT2
  139.       FI=I
  140.       UX=UX+FI*XT*TEMP
  141.       UY=UY-FI*YT*TEMP
  142.       XT=XT2
  143.    70 YT=YT2
  144.       SUMSQ=UX*UX+UY*UY
  145.       IF(SUMSQ) 75,110,75
  146.    75 DX=(V*UY-U*UX)/SUMSQ
  147.       X=X+DX
  148.       DY=-(U*UY+V*UX)/SUMSQ
  149.       Y=Y+DY
  150.    78 IF(DABS(DY)+DABS(DX)-1.0D-05) 100,80,80
  151. C
  152. C        STEP ITERATION COUNTER
  153. C
  154.    80 ICT=ICT+1
  155.       IF(ICT-500) 60,85,85
  156.    85 IF(IFIT)100,90,100
  157.    90 IF(IN-5) 50,95,95
  158. C
  159. C        SET ERROR CODE TO 3
  160. C
  161.    95 IER=3
  162.       GO TO 20
  163.   100 DO 105 L=1,NXX
  164.       MT=KJ1-L+1
  165.       TEMP=XCOF(MT)
  166.       XCOF(MT)=COF(L)
  167.   105 COF(L)=TEMP
  168.       ITEMP=N
  169.       N=NX
  170.       NX=ITEMP
  171.       IF(IFIT) 120,55,120
  172.   110 IF(IFIT) 115,50,115
  173.   115 X=XPR
  174.       Y=YPR
  175.   120 IFIT=0
  176.   122 IF(DABS(Y)-1.0D-4*DABS(X)) 135,125,125
  177.   125 ALPHA=X+X
  178.       SUMSQ=X*X+Y*Y
  179.       N=N-2
  180.       GO TO 140
  181.   130 X=0.0
  182.       NX=NX-1
  183.       NXX=NXX-1
  184.   135 Y=0.0
  185.       SUMSQ=0.0
  186.       ALPHA=X
  187.       N=N-1
  188.   140 COF(2)=COF(2)+ALPHA*COF(1)
  189.   145 DO 150 L=2,N
  190.   150 COF(L+1)=COF(L+1)+ALPHA*COF(L)-SUMSQ*COF(L-1)
  191.   155 ROOTI(N2)=Y
  192.       ROOTR(N2)=X
  193.       N2=N2+1
  194.       IF(SUMSQ) 160,165,160
  195.   160 Y=-Y
  196.       SUMSQ=0.0
  197.       GO TO 155
  198.   165 IF(N) 20,20,45
  199.       END
  200.